package com.fpf.lab01_basics;

//ThreadLocal 隔离：两个线程分别存值，互不影响"。
public class Demo9_ThreadLocal {
    /**
     * ThreadLocal 为每个访问它的线程维护一个独立的变量副本
     * 每个线程只能看到和修改自己的副本，不会影响其他线程的副本
     */
    private static final ThreadLocal<Integer> local = ThreadLocal.withInitial(() -> 0);

    public static void main(String[] args) throws InterruptedException {
        Runnable task = () -> {
            local.set((int) (Math.random() * 1000));
            System.out.println(Thread.currentThread().getName() + " -> " + local.get());
        };
        Thread t1 = new Thread(task, "T-A");
        Thread t2 = new Thread(task, "T-B");
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        // 主线程读取不到子线程设置的值,主线程尝试获取 ThreadLocal 的值，会得到初始值 0，而不是子线程设置的值
        System.out.println("main -> "+local.get());
    }
    /**
     * 注意事项
     * 使用 ThreadLocal 时需要注意：
     *
     * 内存泄漏：如果 ThreadLocal 被设置为静态的，并且长期存活，而线程被重用（如线程池中的线程），可能导致内存泄漏
     * 使用完毕后应调用 remove() 方法清理，特别是在线程池环境中
     * ThreadLocal 不适用于需要在线程间共享数据的场景
     */
}
